package com.xzp.dynamic_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理类 实现InvocationHandler接口
 *
 * @author briarbear
 * @blog https://briarbear.github.io
 * @create 2018-07-20-14:54
 */
public class HelloServiceProxy implements InvocationHandler {

    /**
     * 真实服务对象
     */
    private Object target;

    /**
     * 绑定委托对象，并返回一个代理类
     * @param target
     * @return
     */
    public Object bind(Object target){
        this.target = target;
        //取得代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    /**
     *  通过代理对象调用方法首先进入这个方法
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.err.println("###########我的JDK动态代理############");
        Object result = null;
        //反射方法前调用
        System.err.println("我准备说hello");
        // 执行方法,相当于调用HelloServiceImpl类的sayHello方法.
        result = method.invoke(target, args);
        // 反射方法后调用.
        System.err.println("我说过hello了.");
        return result;
    }
}
